package com.cuif.aop.aspectj;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * 观众 - 一个切面类 ,根据演员动作执行
 * @author cuif
 *
 */
@Aspect
public class Audience {
	
	/**
	 * 引入通知,
	 */
	@DeclareParents(value="com.cuif.aop.Singer",defaultImpl=ModifyDateImpl.class)
	private ModifyDate md ;
	
	/**
	 * 定义在切入点
	 * * *..*Perform.*(..)
	 * 1.*任意返回类型
	 * 2.*..任意包/子包
	 * 3.*Perform 以 Perform 结尾的类,或实现类
	 * 4.*() 任意方法
	 * 5.(..) 任意方法参数
	 */
	@Pointcut("execution(* com.cuif.aop.Perform.songBAT(..))")
	public void perform(){
	}
	
	/**
	 * 签到 - 前置通知
	 */
	@Before(value="perform()")
	public void sign(){
		System.out.println("已经签到!");
	}
	
	/**
	 * 坐好 - 前置通知
	 * JoinPoint 连接点信息
	 */
	@Before(value="perform()")
	public void sitDown(JoinPoint jp){
		System.out.println(jp.getSignature().getName());
		System.out.println(jp.getArgs());
		System.out.println(jp.getTarget());
		System.out.println(jp.getThis());
		System.out.println("已经坐好!");
	}
	
	/**
	 * 鼓掌 - 后置成功通知
	 */
	@AfterReturning(value="perform()",returning="ret")
	public void applause(Object ret){
		System.out.println("表演很精彩!" + ret);
	}
	
	/**
	 * 吐槽- 后置异常通知
	 */
	@AfterThrowing(value="perform()",throwing="e")
	public void complaints(Exception e){
		e.printStackTrace();
		System.out.println("这都是些什么东西呀!");
	}
	
	/**
	 * 回家 - 结束通知
	 */
	@After(value="perform()")
	public void gohome(){
		System.out.println("回家!洗洗睡!");
	}
}
